# 可以为路径查询添加额外的校验和元数据，Path 库


from fastapi import FastAPI, Query, Path
from typing import Optional, List, Dict
import uvicorn

app = FastAPI()


# 元数据
@app.get("/items/{item_id}")
def read_items(item_id: Optional[str] = Path(default=..., min_length=2, max_length=10, regex=".*菠萝$",
                                             title="标题",
                                             description="很长很长的描述",
                                             deprecated=True)):
    return {"item_id": item_id}


'''
    路径参数始终是必需的，因为它必须是路径的一部分
    所以，Path 的 default 参数值必须设为 ... 
    
    元数据不应该使用 alias
    因为路径参数并不能通过 参数名=value 的形式来传值，所以没有办法通过 alias = value 的方式给别名传值，最终将会报错
'''

# 函数排序问题
# @app.get("/items/{item_id}")
# def read_items(item_id: int = Path(...), name: str):   # 这里报错的 原因是item_id: int = Path(...) 识别为默认参数，
#                                                         # 而 q: str 是位置参数，位置参数不能在默认参数后面
#     return {"item_id": item_id}

'''
    如何解决呢？  将 * 作为第一个参数，那么 * 后面的所有参数都会当做关键字参数处理，即使它们没有设置默认值（像 name）
'''


@app.get("/items/{item_id}")
def read_items(*, item_id: int = Path(...), name: str):  # 这里报错的 原因是item_id: int = Path(...) 识别为默认参数，
    # 而 q: str 是位置参数，位置参数不能在默认参数后面
    return {"item_id": item_id}


# 数字类型校验
# Query 、 Path都可以添加数字校验

'''
# 大于
gt: Optional[float] = None

# 大于等于
ge: Optional[float] = None

# 小于
lt: Optional[float] = None

# 小于等于
le: Optional[float] = None
'''


@app.get("/number/{item_id}")
async def read_items(
        *,
        item_id: int = Path(..., title="The DM", gt=10, le=20),
        name: str = None):
    return {"item_id": item_id, "name": name}


if __name__ == '__main__':
    uvicorn.run(app='main:app', host='127.0.0.1', port=8000, reload=True, debug=True)
